每天学习一点R:16.barplot条形图之整合点线图
在上一篇的推文中,我仿照文献中的图绘制了一个利用条形图和“点+垂线”组成展示样品中抗生素抗性基因和可移动基因单元检出数目的绘图方法,今天继续仿照文献中的图绘制条形图与点线图结合,同时展示样品中目的基因绝对丰度和相对丰度的图形绘制方法。
本文会详细介绍绘图过程中如何进行条形图的绘制并通过修改参数对图像进行调整,本文旨在通过绘图实例讲解各个参数的使用方法,希望大家能够活学活用。
特别要注意的是,本文内容中涉及的具体参数数值是根据绘图数据和生成图像的大小设置的,在自己绘制图像时需要根据自己的数据进行调整,切勿直接套用。
例图展示
原本文章中的图如下所示,使用堆叠的条形展示不同类型抗生素抗性基因的相对丰度,使用单独的条形展示可移动基因单元的相对丰度,之后使用点线图展示了抗生素抗性基因的总丰度。
我在绘图的过程中,对图像进行了轻微的改动,添加了不同组样本间的间隔以更好的区分样品的分组信息,最终的图像就是下方这样。
先给出绘图的完整代码:
args.mges.number <- read.table("ARGs.MGEs.abundance.txt",header = TRUE,sep = "\t",row.names = 1)
args.16s.abundance <- read.table("ARGs.16S.abundance.txt",header = TRUE,sep = "\t",row.names = 1)
args.mges.number <- as.matrix(args.mges.number)
args.16s.abundance <- as.matrix(args.16s.abundance)
library(RColorBrewer)
tiff(filename = "ARGs.MGEs.abundance.time.tiff",width = 12000,height = 9000,res = 600,compression = "lzw")
par(mar=c(6.3,8,4,10))
bar1 <- barplot(args.mges.number[1:8,],names.arg = c(rep("",27)),space = 0.1,col = brewer.pal(8,"Set3"),border = "black",xlim = c(0,29),axes = F,ylim = c(0,0.015))
axis(side = 2,at = seq(0,0.015,0.003),las = 2,line = -1.55,cex.axis = 2.2,lwd = 3,lwd.ticks = 3,font = 2)
bar2 <- barplot(args.mges.number[9,],names.arg = c(rep("",27)),space = 0.1,col = "yellow",border = "black",xlim = c(0,29),axes = F,ylim = c(0,0.015),add = TRUE)
par(xpd = TRUE)
par(new = T)
par(mar = c(4,8,4,10))
plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),y = args.16s.abundance[1,],type = "b",col = "red",axes = F,xlim = c(0,29),xlab = "",ylab = "",ylim = c(0,12),pch = 19,bg = "red",cex = 4,lwd = 5)
par(xpd = TRUE)
par(new = T)
par(mar = c(4,8,4,10))
plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),y = args.16s.abundance[2,],type = "b",col = "black",axes = F,xlim = c(0,29),xlab = "",ylab = "",ylim = c(0,12),pch = 19,bg = "black",cex = 4,lwd = 5)
axis(side = 1, at = c(-0.2,1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65,30),line = -1,labels = FALSE,cex.axis = 2.2,lwd = 3,lwd.ticks = 3,font = 2)
text(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65), y = -0.42,adj = c(1,0.8),labels = colnames(args.16s.abundance),cex = 2.4, font = 2,srt = 45)
axis(side = 4,at = c(0,3,6,9,12),line = 1,las = 2,cex.axis = 3,lwd = 3,lwd.ticks = 3,font = 2)
mtext("Normalized copy number (copies per 16S rRNA gene)",side = 2,line = 5.2,font = 2,cex = 3)
mtext("Abundance (copies per g dry sediment)",side = 4,line = 6,font = 2,cex = 3)
par(xpd=TRUE)
par(new = T)
plot(0:1, 0:1, type="n", xlab="",ylab="", axes=FALSE)
legend(-0.02,1.1,legend = rownames(args.mges.number[1:8,]),fill = brewer.pal(8,"Set3"),bty = "n",ncol = 4,text.width = 0.21,cex = 2.5,text.font = 2)
legend(0.01,0.55,legend = c("Total ARGs","16S rRNA gene"),pch = 19,col = c("red","black"),bty = "n",cex = 2.5,pt.cex = 3.3,text.font = 2,text.width = 0.2,x.intersp = 1.35,lty = 1,lwd = 5)
legend(-0.02,1.015,legend = "MGEs",fill = "yellow",bty = "n",cex = 2.5,text.font = 2)
dev.off()
图像的绘制需要两个数据文件,一个用于绘制条形图,另一个用于绘制点线图。
点线图的绘制文件就是普通的数据表格式。
条形图的绘制文件比较特殊,每一个样品的数据占两列,分别代表两个相邻条形的绘制数据,并且在不同组样品间需要间隔一个无数据的空列。
绘图过程详解
首先载入绘图数据和绘图所需要的包。
#分别载入两个绘图数据,将第一行和第一列设为行名和列名
args.mges.number <- read.table("ARGs.MGEs.abundance.txt",
header = TRUE,sep = "\t",row.names = 1)
args.16s.abundance <- read.table("ARGs.16S.abundance.txt",
header = TRUE,sep = "\t",row.names = 1)
#将两个绘图数据转换为矩阵
args.mges.number <- as.matrix(args.mges.number)
args.16s.abundance <- as.matrix(args.16s.abundance)
#载入所需要的颜色包
library(RColorBrewer)
堆叠条形图的绘制
首先绘制第一个堆叠的条形图。
#定义图像输出路径和大小
tiff(filename = "ARGs.MGEs.abundance.time.tiff",
width = 12000,height = 9000,res = 600,compression = "lzw")
#定义绘图区
par(mar=c(6.3,8,4,10))
#绘制条形图
bar1 <- barplot(args.mges.number[1:8,],
names.arg = c(rep("",27)),space = 0.1,
col = brewer.pal(8,"Set3"),border = "black",
xlim = c(0,29),axes = F,ylim = c(0,0.015))
#添加坐标轴
axis(side = 2,at = seq(0,0.015,0.003),
las = 2,line = -1.55,cex.axis = 2.2,
lwd = 3,lwd.ticks = 3,font = 2)
这里绘图边界的大小要根据实际需要进行调整,主要是要满足后续点线图与条形图的匹配,以及为坐标轴和图例留出足够的空间。
条形图只使用[1:8,]选择前8行进行绘图,第9行是可移动基因单元,用于绘制点线图。
names.arg将x轴坐标设置为空,axes = F将坐标轴隐藏,这样才能通过后续的自主添加调整坐标轴及标签的位置,自带的坐标轴位置固定并且各项参数不好调整。
注意这里x轴对应的样品数目并不是真实的样品数目,而是数据表中列的总数(每一个样品对应两列,外加组间的空列)。
应用space = 0.1设置一个较小的条形间距,以便在添加第二个条形图时能够进行有效的区分。
xilm和ylim设置x和y轴的范围,x轴设置为样品数目+2,我在绘图前已经规划好将图例放在上方,因而y轴的范围进行了适当的扩大。
要特别注意y轴的范围要设置的大一些,以保证在条形上方预留足够的空间用于点线图的绘制。
将条形图赋值为bar1,后续会持续用到。
之后使用axis()函数添加条形图对应的纵坐标轴。
邻近条形图的绘制
在第一个条形图的基础上,添加与之相邻的第二个条形图。
bar2 <- barplot(args.mges.number[9,],
names.arg = c(rep("",27)),space = 0.1,
col = "yellow",border = "black",
xlim = c(0,29),axes = F,ylim = c(0,0.015),
add = TRUE
应用[]命令选择第9行的数据用于绘制第二个条形图,注意比对上文提到的数据格式。
将条形颜色设置为与第一个条形图不同的颜色,并且将add参数设置为TRUE,这样才能在第一个图基础上添加第二个条形图。
其余参数与第一个条形图一致。
将条形图赋值为bar2,后续会持续用到。
点线图添加
之后进行点线图的添加。
#添加第一条点线图
par(xpd = TRUE)
par(new = T)
par(mar = c(4,8,4,10))
plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),
y = args.16s.abundance[1,],type = "b",
col = "red",axes = F,xlim = c(0,29),
xlab = "",ylab = "",ylim = c(0,12),
pch = 19,bg = "red",cex = 4,lwd = 5)
#添加第二条点线图
par(xpd = TRUE)
par(new = T)
par(mar = c(4,8,4,10))
plot(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),
y = args.16s.abundance[2,],type = "b",
col = "black",axes = F,xlim = c(0,29),
xlab = "",ylab = "",ylim = c(0,12),
pch = 19,bg = "black",cex = 4,lwd = 5)
首先通过par(xpd = TRUE)命令使得接下来绘制的图像可以在条形图绘图边界部分显示,防止后续图像显示不全。
接下来要新建用于绘制点线图的绘图区,绘图区边界大小根据出图效果进行调整。
使用plot()函数先绘制散点图,散点图中x轴对应的信息根据bar1和bar2中每个条形所对应的x轴位置进行计算,保证每个点的位置都为与该样本两个条形的正中。
根据第二个绘图数据文件中的行数分别进行点线图的绘制,每行数据要单独绘制点线图。
同样应用axes = F隐藏坐标轴,将x和y轴标签设置为空,选择type = “b”绘制点线图,点的形状选择19为实心圆形,点和线的颜色根据数据需求自行选择并记录,在之后图例添加过程中进行对应。
其它参数根据图像的展示情况调整直至满意。
这里要特别注意点线图y轴范围的确定,要保证所添加的点线图位于条形图上方无遮挡。
添加其它坐标轴
首先添加横坐标信息。
axis(side = 1, at = c(-0.2,1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65,30),
line = -1,labels = FALSE,cex.axis = 2.2,
lwd = 3,lwd.ticks = 3,font = 2)
text(x = c(1.15,3.35,5.55,8.85,11.05,13.25,16.55,18.75,20.95,24.25,26.45,28.65),
y = -0.42,adj = c(1,0.8),
labels = colnames(args.16s.abundance),
cex = 2.4, font = 2,srt = 45)
side = 1规定坐标轴在下方,labels = FALSE隐藏轴的标签,line调整轴与图像的间距。
cex.axis、lwd、lwd.ticks和font的参数与之前绘制的条形图纵坐标轴保持一致。
之后使用text()函数添加x轴标签,这样做是为了能够方便地对标签进行调整,例如改变其对其方式、大小、位置、旋转角度等。
注意x轴标签位置要与点线图的x轴坐标位置一致。
接下来添加点线图对应的纵坐标轴。
axis(side = 4,at = c(0,3,6,9,12),
line = 1,las = 2,cex.axis = 3,
lwd = 3,lwd.ticks = 3,font = 2)
相关参数与第一条纵坐标轴一致,除了应用side = 4将其放置在图像右侧,并且根据会图数据改变其标签间隔。
最后使用mtext()命令添加两个坐标轴对应的labels。
mtext("Normalized copy number (copies per 16S rRNA gene)",
side = 2,line = 5.2,font = 2,cex = 3)
mtext("Abundance (copies per g dry sediment)",
side = 4,line = 6,font = 2,cex = 3)
图例添加
首先要新建一个绘图区,并且建立一个空的图用来辅助图例的添加。
par(xpd=TRUE)
par(new = T)
plot(0:1, 0:1, type="n", xlab="",ylab="", axes=FALSE)
之后要分批次的添加图例,首先添加堆叠条形图的图例。
legend(-0.02,1.1,legend = rownames(args.mges.number[1:8,]),
fill = brewer.pal(8,"Set3"),
bty = "n",ncol = 4,text.width = 0.21,
cex = 2.5,text.font = 2)
在条形图的图例添加时,要注意预留第二个条形图图例的位置。
使用ncol调整图例的列数,text.width调整不同列见图例的宽度以达到对图例文字的完整展示。
其它参数根据出图效果进行调整。
之后添加临近条形图的图例。
legend(-0.02,1.015,legend = "MGEs",
fill = "yellow",bty = "n",
cex = 2.5,text.font = 2)
通过参数的调整,使得该图例看起来与之前插入的条形图图例为同一个图例。
最后添加点线图的图例。
legend(0.01,0.55,legend = c("Total ARGs","16S rRNA gene"),
pch = 19,col = c("red","black"),
bty = "n",cex = 2.5,pt.cex = 3.3,
text.font = 2,text.width = 0.2,
x.intersp = 1.35,lty = 1,lwd = 5)
dev.off()
#dev.off()用于结束绘图,并按照绘图最开始的命令将图像输出
通过xy坐标调整图例的位置,cex、pt.cex调整点和文字的大小,x.intersp调整点和文字的间距,调整至自己满意即可。